//一副牌的基本属性（包含创建过程，或者说是“买一副牌”）

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class CardDemo {

    /*public static void main(String[] args) {
        List<Card> cards = buyDeck();
    }*/
    //
    //public static final String[] SUITS = {"Hearts", "Clubs", "Diamonds", "Spades"};
    public static final String[] SUITS = {"♥","♣","♦","♠"};

    //买一副牌（创造）
    public static List<Card> buyDeck() {

        List<Card> deck = new ArrayList<>(52);
        //这里干嘛要写List呢？都写成ArrayList,不行吗？

        for(int i = 0; i < 4; i++){

            //
            for(int j = 0; j < 13; j++){

                //
                String suit = SUITS[i];
                int rank = j;
                Card card = new Card();
                card.suit=suit;//花色
                card.rank=rank;//数值

                deck.add(card);
                //非常重要的一步！！！
                //创造完这张牌，要加到顺序表中。

            }

        }
        return deck;
    }


    //swap
    public static void swap(List<Card> deck, int i, int j){

        Card temp = deck.get(i);
        deck.set(i, deck.get(j));
        deck.set(j, temp);

    }

    //洗牌
    //所用交换功能，可以封装成另一个内部私有方法：private static void swap()
    public static void shuffle(List<Card> deck){

        //这里在看一下：如何生成随机数：
        Random rand = new Random();
                                //这里干嘛给这个数？
                                //这里需要注意：可以不给这个随机种子，它会根据时间生成
                                //但是给出之后，每次根据这个随机种子生成，每次的生成结果都一样，反而，不够随机

        for(int i = deck.size()-1;i>0;i--){
            //这里为什么要倒着来呀？？？——————直到了，方便生成随机数（范围更好写）
            //为什么不能等于0？？？————老师：因为random有要求，不可以小于等于0，了解即可

            int r = rand.nextInt(i);
            //这是怎么个生成方法？
            //我好像知道了：
            //生成[0,i)的随机数
            //将原来有序的数组元素，依次交换到随机生成的下标的位置
            //这样，能保证，原来数组的每个下标空间，都进行了一次“主动”交换（我说的哈哈哈）
            //i的变化是有有序的，控制的就是这个
            //随机生成的数——下标，是无序的，用来达到“洗牌”的效果
            swap(deck,i,r);


        }

    }




    //抓牌
    //三个人，每个人轮流抓5张牌
    public static void catchCards(List<Card> deck) {

        List<List<Card>> hands = new ArrayList<>(3);
        hands.add(new ArrayList<>(5));
        hands.add(new ArrayList<>(5));
        hands.add(new ArrayList<>(5));
        for(int i = 0; i < 5; i++){

            for(int j = 0; j < 3; j++){

                hands.get(j).add(deck.remove(0));
                                             //“remove(0)——意思是，将当前牌组中的第一张（下标为0），删掉”
                                             //但是，这样一来，怎么add呢？remove返回的可是boolean类型呀……
                                             //这里先标记一下《有疑问》《有疑问》《有疑问》《有疑问》《有疑问》《有疑问》
                                             //OK，解决了，并且学会了一点找源码、看源码的知识、方法
                hands.get(j).add(deck.remove(0));
                hands.get(j).add(deck.remove(0));


            }

        }

        //把抓牌结果——每个人手中的牌打印出来
        for(int i = 0; i < 3; i++){

            System.out.println("第"+(i+1)+"个人手中的牌：");

            for(int j = 0; j < 5; j++){

                System.out.println(hands.get(i).get(j));

            }

        }

    }


}
